package Gui;

import it.cnr.imaa.essi.lablib.gui.checkboxtree.CheckboxTree;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;

import Gui.Modele.ModelSkladnikowPodsumowania;
import Gui.Modele.ModelTabeliPodsumowan;

public class FrameGlowneOkno extends JFrame {

	public static boolean WindowsLookAndFeel = false;
	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JSplitPane panelDzielony = null;
	private JScrollPane scrollTabelaPodsumowan = null;
	private JTable tablePodsumowania = null;
	private ModelTabeliPodsumowan modelTabeliPodsumowan = null;
	private DialogKonfiguracjaWag oknoKonfiguracjiWag = null;
	private DialogSzczegolyPodsumowania oknoSzczegolyPodsumowania = null;
	private ObslugaAplikacji obslugaAplikacji = null;
	private JToolBar barNarzedzia = null;
	private JScrollPane scrollDrzewoSkladnikowPodsumowan = null;
	public CheckboxTree drzewoSkladnikowPodsumowania = null;
	private ModelSkladnikowPodsumowania skladnikiPodsumowania;
	private JButton btnWczytajBazeDanych = null;
	private JButton btnWczytajKonfiguracje = null;
	private JButton btnWygenerujPodsumowania = null;
	private JButton btnZamknij = null;
	private JButton btnKonfiguracjaWag = null;
	private JButton btnZapiszKonfiguracje = null;

	//=========================== METODY POMOCNICZE ====================================
	public ModelTabeliPodsumowan getModelTabeliPodsumowan() {
		if (modelTabeliPodsumowan == null) {
			modelTabeliPodsumowan = new ModelTabeliPodsumowan();
		}
		return modelTabeliPodsumowan;
	}

	public ModelSkladnikowPodsumowania getModelSkladnikowPodsumowania() {
		if (skladnikiPodsumowania == null) {
			skladnikiPodsumowania = new ModelSkladnikowPodsumowania();
		}
		return skladnikiPodsumowania;
	}
	
	public float[] getWagi(){
		return oknoKonfiguracjiWag.getWagi();
	}
	
	public DialogSzczegolyPodsumowania getOknoSzczegolyPodsumowania(){
		if(oknoSzczegolyPodsumowania == null){
			oknoSzczegolyPodsumowania = new DialogSzczegolyPodsumowania();
		}
		return oknoSzczegolyPodsumowania;
	}

	//=========================== INICJALIZACJA GUI ====================================
	private JSplitPane getPanelDzielony() {
		if (panelDzielony == null) {
			panelDzielony = new JSplitPane();
			panelDzielony.setOneTouchExpandable(true);
			panelDzielony.setDividerSize(8);
			panelDzielony.setRightComponent(getScrollTabelaPodsumowan());
			panelDzielony.setLeftComponent(getScrollDrzewoSkladnikowPodsumowan());
			panelDzielony.setDividerLocation(270);
		}
		return panelDzielony;
	}

	private JScrollPane getScrollTabelaPodsumowan() {
		if (scrollTabelaPodsumowan == null) {
			scrollTabelaPodsumowan = new JScrollPane();
			scrollTabelaPodsumowan.setViewportView(getTablePodsumowania());
		}
		return scrollTabelaPodsumowan;
	}

	private JTable getTablePodsumowania() {
		if (tablePodsumowania == null) {
			tablePodsumowania = new JTable();
			tablePodsumowania
					.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			tablePodsumowania.setShowGrid(true);
			tablePodsumowania.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
			tablePodsumowania.setFillsViewportHeight(true);
			tablePodsumowania.setAutoCreateRowSorter(true);
			tablePodsumowania.setModel(getModelTabeliPodsumowan());
			tablePodsumowania.addMouseListener(new MouseListener() {
				
				@Override
				public void mouseReleased(MouseEvent e) {
				}	
				@Override
				public void mousePressed(MouseEvent e) {
				}
				@Override
				public void mouseExited(MouseEvent e) {
				}
				@Override
				public void mouseEntered(MouseEvent e) {
					// TODO Auto-generated method stub
					
				}
				@Override
				public void mouseClicked(MouseEvent e) {
					   if (e.getClickCount() == 2) {
					      JTable tabela = (JTable)e.getSource();
					      int numerWiersza = tabela.getSelectedRow();
					      obslugaAplikacji.pokazSzczegolyPodsumowania(numerWiersza);
					   }
					}
			});
		}
		return tablePodsumowania;
	}

	private JToolBar getBarNarzedzia() {
		if (barNarzedzia == null) {
			barNarzedzia = new JToolBar();
			barNarzedzia.setPreferredSize(new Dimension(18, 30));
			barNarzedzia.setFloatable(false);
			barNarzedzia.add(getBtnZamknij());
			barNarzedzia.addSeparator();
			barNarzedzia.add(getBtnWczytajBazeDanych());
			barNarzedzia.add(getBtnWczytajKonfiguracje());
			barNarzedzia.add(getBtnZapiszKonfiguracje());
			barNarzedzia.addSeparator();
			barNarzedzia.add(getBtnKonfiguracjaWag());
			barNarzedzia.addSeparator();
			barNarzedzia.add(getBtnWygenerujPodsumowania());
		}
		return barNarzedzia;
	}

	private JScrollPane getScrollDrzewoSkladnikowPodsumowan() {
		if (scrollDrzewoSkladnikowPodsumowan == null) {
			scrollDrzewoSkladnikowPodsumowan = new JScrollPane();
			scrollDrzewoSkladnikowPodsumowan.setViewportView(getDrzewoSkladnikowPodsumowania());
		}
		return scrollDrzewoSkladnikowPodsumowan;
	}

	private CheckboxTree getDrzewoSkladnikowPodsumowania() {
		if (drzewoSkladnikowPodsumowania == null) {
			drzewoSkladnikowPodsumowania = new CheckboxTree();
			getModelSkladnikowPodsumowania().setDrzewo(
					drzewoSkladnikowPodsumowania);
		}
		return drzewoSkladnikowPodsumowania;
	}

	private JButton getBtnWczytajBazeDanych() {
		if (btnWczytajBazeDanych == null) {
			btnWczytajBazeDanych = new JButton();
			btnWczytajBazeDanych.setText("");
			btnWczytajBazeDanych
					.setToolTipText("Otwiera okno wczytywania pliku bazy danych");
			btnWczytajBazeDanych.setIcon(new ImageIcon(getClass().getResource(
					"/Gui/Ikony/bazadanych.png")));
			btnWczytajBazeDanych.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					obslugaAplikacji.wczytajBazeDanych();
				}

			});
		}
		return btnWczytajBazeDanych;
	}

	private JButton getBtnWczytajKonfiguracje() {
		if (btnWczytajKonfiguracje == null) {
			btnWczytajKonfiguracje = new JButton();
			btnWczytajKonfiguracje.setText("");
			btnWczytajKonfiguracje
					.setToolTipText("Otwiera okno wczytywania pliku z konfiguracja skladnikow podsumowania");
			btnWczytajKonfiguracje.setIcon(new ImageIcon(getClass()
					.getResource("/Gui/Ikony/wczytaj.png")));
			btnWczytajKonfiguracje.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					obslugaAplikacji.wczytajKonfiguracje();
				}

			});
		}
		return btnWczytajKonfiguracje;
	}

	private JButton getBtnWygenerujPodsumowania() {
		if (btnWygenerujPodsumowania == null) {
			btnWygenerujPodsumowania = new JButton();
			btnWygenerujPodsumowania.setText("");
			btnWygenerujPodsumowania
					.setToolTipText("Rozpoczyna generowanie podsumowan dla zaznaczonych skladnikow");
			btnWygenerujPodsumowania.setIcon(new ImageIcon(getClass()
					.getResource("/Gui/Ikony/wygeneruj.png")));
			btnWygenerujPodsumowania.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					obslugaAplikacji.wygenerujPodsumowania();
				}

			});
		}
		return btnWygenerujPodsumowania;
	}

	private JButton getBtnZamknij() {
		if (btnZamknij == null) {
			btnZamknij = new JButton();
			btnZamknij.setText("");
			btnZamknij.setToolTipText("Kończy dzialanie programu");
			btnZamknij.setIcon(new ImageIcon(getClass().getResource(
					"/Gui/Ikony/zamknij.png")));
			btnZamknij.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					dispose();
				}

			});
		}
		return btnZamknij;
	}

	private JButton getBtnKonfiguracjaWag() {
		if (btnKonfiguracjaWag == null) {
			btnKonfiguracjaWag = new JButton();
			btnKonfiguracjaWag.setText("");
			btnKonfiguracjaWag
					.setToolTipText("Wyswietla okno pozwalajace na zmiane wag dla poszczegolnych ocen podsumowania");
			btnKonfiguracjaWag.setIcon(new ImageIcon(getClass().getResource(
					"/Gui/Ikony/konfiguracja.png")));
			btnKonfiguracjaWag.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					oknoKonfiguracjiWag.setVisible(true);
				}

			});
		}
		return btnKonfiguracjaWag;
	}
	private void initialize() {
		this.setSize(815, 544);
		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		this.setContentPane(getJContentPane());
		this.setTitle("Podsumowania lingwistyczne");
		UIManager.put("FileChooser.saveButtonText", "Zapisz");
		UIManager.put("FileChooser.openButtonText", "Otwórz");
		UIManager.put("FileChooser.cancelButtonText", "Anuluj");
		UIManager.put("FileChooser.updateButtonText", "Modyfikuj");
		UIManager.put("FileChooser.helpButtonText", "Pomoc");
		UIManager.put("FileChooser.fileNameLabelText", "Nazwa pliku:");
		UIManager.put("FileChooser.filesOfTypeLabelText", "Pliki typu:");
		UIManager.put("FileChooser.upFolderToolTipText",
				"Do góry o jeden poziom");
		UIManager.put("FileChooser.homeFolderToolTipText", "Folder domowy");
		UIManager.put("FileChooser.newFolderToolTipText", "Utwórz nowy folder");
		UIManager.put("FileChooser.listViewButtonToolTipText", "Lista");
		UIManager.put("FileChooser.detailsViewButtonToolTipText", "Szczegóły");
		oknoKonfiguracjiWag = new DialogKonfiguracjaWag(this);
		oknoSzczegolyPodsumowania = getOknoSzczegolyPodsumowania();
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getBarNarzedzia(), BorderLayout.NORTH);
			jContentPane.add(getPanelDzielony(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	

	//=========================== KONSTRUKTOR ====================================
	
	public FrameGlowneOkno() {
		super();
		if (WindowsLookAndFeel) {
			try {
				UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
			} catch (UnsupportedLookAndFeelException e) {

			} catch (ClassNotFoundException e) {

			} catch (InstantiationException e) {

			} catch (IllegalAccessException e) {

			}
			SwingUtilities.updateComponentTreeUI(this);
		}
		obslugaAplikacji = ObslugaAplikacji.wezInstancje();
		obslugaAplikacji.setGlowneOknoAplikacji(this);
		initialize();
	}

	/**
	 * This method initializes btnZapiszKonfiguracje	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnZapiszKonfiguracje() {
		if (btnZapiszKonfiguracje == null) {
			btnZapiszKonfiguracje = new JButton();
			btnZapiszKonfiguracje.setText("Konfiguracja(TEST)");
			btnZapiszKonfiguracje.setIcon(new ImageIcon(getClass().getResource("/Gui/Ikony/zapisz.png")));
			btnZapiszKonfiguracje.setVisible(false);
			btnZapiszKonfiguracje.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					obslugaAplikacji.dodajTestoweSkladniki();
					obslugaAplikacji.zapiszKonfiguracje("skladniki.xml");
					obslugaAplikacji.pokazInformacje("Zapisywanie konfiguracji zakończone");
				}

			});
			
		}
		return btnZapiszKonfiguracje;
	}

}
